home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d8 / phonev4.arc / PHONEV4.ASM < prev    next >
Assembly Source File  |  1991-05-07  |  15KB  |  530 lines

  1. ;        Phone monitor - CFHSoftware
  2. ;
  3. ;
  4. ;     To Assemble:
  5. ;
  6. ;     MASM PHONE;
  7. ;     LINK PHONE;
  8. ;     EXE2BIN PHONE.EXE PHONE.COM
  9. ;
  10. ;
  11. ;       THIS PROGRAM >MUST< BE RUN AS A .COM FILE
  12. ;
  13. ;
  14. MS_DOS  EQU     21H
  15. MOD_STA EQU     6                       ; Offset to 8250 modem-status port
  16. RI      EQU     01000000B               ; Ring indicator
  17. RLSD    EQU     10000000B               ; Received line signal det
  18.  
  19. BOOT_BLIND      MACRO
  20.         MOV     AX,0FFFFH               ; Segment of boot code
  21.         PUSH    AX                      ; Push on the stack
  22.         INC     AX                      ; Make ax=0 (offset of boot code)
  23.         PUSH    AX                      ; Push on the stack
  24.         RETF                            ; Far 'return' to boot code
  25. ENDM
  26.  
  27. PSEG    SEGMENT PARA PUBLIC 'CODE'
  28. BEGIN   EQU     $
  29.         ASSUME  CS:PSEG, DS:PSEG, ES:PSEG, SS:NOTHING
  30.         ORG     100H
  31. MAIN    PROC    NEAR
  32. START   EQU     $
  33.  
  34. STK_TOP LABEL   WORD                    ; Where to start local stack
  35.         JMP     INIT1
  36. MAIN    ENDP
  37. ;
  38. signature       db "CFH"
  39. OLD_INT LABEL   DWORD                   ; Old int 8
  40. OLD_OFF DW      ?                       ; Int 8 offset
  41. OLD_SEG DW      ?                       ; Int 8 segment
  42.  
  43. old_49  label   dword
  44. old_49_off dw   ?
  45. old_49_seg dw   ?
  46.  
  47. RINGS   DB      0
  48. TRIGGER DB      9
  49. LASTRNG DB      ?
  50. LASTCAR DB      ?
  51. tone    dw      10010
  52.  
  53. CHK_PRT DW      0
  54. SS_SAV  DW      ?
  55. SP_SAV  DW      ?
  56. BUSY    DB      0
  57. SOUND   db      0
  58. PSP     dw      0
  59.  
  60. CHANGE_TRIGGER PROC FAR
  61.         PUSH    DS
  62.  
  63.         PUSH    CS
  64.         POP     DS
  65.  
  66.         cmp     ax, 69h
  67.         jnz     nope
  68.         cmp     cx, 69h
  69.         jnz     nope
  70.  
  71.         MOV     BYTE PTR [RINGS], 0
  72.         MOV     BYTE PTR [TRIGGER], BL
  73.         MOV     AX, 1
  74.         MOV     BX, 2
  75.         MOV     CX, 3
  76.         MOV     DX, 4
  77.         POP     DS
  78.         IRET
  79. nope:
  80.         cmp     ax, "UN"
  81.         jne     not_mine
  82.         cmp     bx, "IN"
  83.         jne     not_mine
  84.         cmp     cx, "ST"
  85.         jne     not_mine
  86.         cmp     dx, "AL"
  87.         jne     not_mine
  88.         mov     bx, psp
  89.         mov     cx, cs
  90.  
  91.         MOV     AX,2508H                   ; Patch INT 8
  92.         MOV     DX, cs:old_off             ; DS:DX = new vector
  93.         MOV     DS, cs:old_seg
  94.         INT     MS_DOS
  95.  
  96.         MOV     AX, 2549h
  97.         MOV     DX, cs:old_49_off
  98.         MOV     DS, cs:old_49_seg
  99.         INT     MS_DOS
  100.  
  101.         pop     ds
  102.         IRET
  103. not_mine:
  104.         cmp     ax, "SO"
  105.         jne     nope2
  106.         cmp     bx, "UN"
  107.         jne     nope2
  108.         cmp     cx, "D!"
  109.         jne     nope2
  110.         xor     ah,ah
  111.         mov     al, byte ptr sound
  112.         xor     al,1
  113.         mov     byte ptr sound, al
  114.         POP     DS
  115.         IRET
  116. nope2:
  117.         pop     ds
  118.         jmp     dword ptr cs:[old_49]
  119. CHANGE_TRIGGER ENDP
  120. ;
  121. ;       Check the modem status.
  122. ;
  123. CHK_MOD PROC    NEAR
  124.         PUSH    DX                      ; Save register used
  125.         MOV     DX,WORD PTR [CHK_PRT]   ; Pick up modem-status port
  126.         ADD     DX,MOD_STA
  127.         IN      AL,DX                   ; Get modem status
  128.         AND     AL,RI                   ; Check the bit
  129.         CMP     BYTE PTR [LASTRNG],AL   ; Same last time?
  130.         MOV     BYTE PTR [LASTRNG],AL   ; Set new status
  131.         JZ      NODETR                  ; Yes, ignore.
  132.         CMP     BYTE PTR [LASTRNG],0    ; Not ringing?
  133.         JNZ     @f
  134.         in      al, 61h
  135.         and     al, 11111100b
  136.         out     61h, al
  137.         jmp     nodetr
  138.  
  139.  
  140. @@:     INC     BYTE PTR [RINGS]        ; Number of rings
  141.         cmp     sound, 1                ;is noise allowed?
  142.         jne     nodetr                  ;if not, skip this stuff
  143.         mov     al, 182
  144.         out     43h, al
  145.         mov     ax, tone                ; ringer tone
  146.         sub     ax, 1000
  147.         mov     tone, ax
  148.         out     42h, al
  149.         mov     al, ah
  150.         out     42h, al
  151.         in      al, 61h
  152.         or      al, 3
  153.         out     61h, al
  154. ;
  155. NODETR:
  156.         CMP     BYTE PTR [LASTRNG],0    ; Not ringing?
  157.         MOV     DX,WORD PTR [CHK_PRT]   ; Pick up modem-status port
  158.         ADD     DX,MOD_STA
  159.         IN      AL,DX                   ; Get modem status
  160.         AND     AL,RLSD                 ; Check the bit
  161.         MOV     BYTE PTR [LASTCAR],AL   ; Set new status
  162.         CMP     BYTE PTR [LASTCAR],0    ; See if the carrier is off
  163.         JZ      CAROFF                  ; Yes it is.
  164.         MOV     BYTE PTR [RINGS],0      ; Carrier's on, zero the ring-count
  165.         mov     word ptr [tone], 9010   ;  and the tone
  166. CAROFF: POP     DX                      ; Restore registers used
  167.         RET
  168. CHK_MOD ENDP
  169. ;
  170. ;       Main Interrupt routine. This is patched to the clock interrupt at
  171. ;       INT 08. After checking, it continues to main DOS routines.
  172. ;
  173. INTER   PROC    FAR
  174.         CMP     BYTE PTR CS:[TRIGGER],0 ;see if we are disabled
  175.         JZ      @F
  176.         CMP     BYTE PTR CS:[BUSY],0    ; See if we are re-entering
  177.         JZ      NOBUSY                  ; No.
  178. @@:     JMP     DWORD PTR CS:[OLD_int]  ; Continue to old vector
  179. ;
  180. NOBUSY: MOV     BYTE PTR CS:[BUSY],0FFH ; Set busy flag
  181.         CLI
  182.         MOV     WORD PTR CS:[SS_SAV],SS ; Save stack-segment
  183.         MOV     WORD PTR CS:[SP_SAV],SP ; Save stack-pointer
  184.         PUSH    CS
  185.         POP     SS                      ; SS = CS
  186.         MOV     SP,OFFSET STK_TOP       ; Set up local stack
  187.         STI                             ; Allow interrupts
  188. ;
  189.         PUSH    AX                      ; Free up a working register
  190.         PUSH    DS                      ; Save data-segment
  191.  
  192.         PUSH    CS                      ; Establish addressability
  193.         POP     DS                      ; DS = CS
  194.  
  195.         CALL    CHK_MOD
  196.         MOV     AL, BYTE PTR [TRIGGER]
  197.         CMP     BYTE PTR CS:[RINGS], AL ; modem rings > AL ? <<<<<<<<<<<<<<
  198.         JG      CRASH                   ; Yes, crash the system.
  199.         POP     DS
  200.         POP     AX
  201.         CLI                             ; No interrupts
  202.         MOV     SS,WORD PTR CS:[SS_SAV] ; Restore user stack
  203.         MOV     SP,WORD PTR CS:[SP_SAV]
  204.         MOV     BYTE PTR CS:[BUSY],0    ; Free up busy-flag
  205.         STI                             ; Allow interrupts
  206.         JMP     DWORD PTR CS:[OLD_INT]  ; Continue to old vector
  207. CRASH:
  208.         BOOT_BLIND
  209. INTER  ENDP
  210.  
  211. TOP     EQU     $
  212. ;
  213. ;       Iniitialization code. This space is used only once then given up.
  214. ;
  215.  
  216. ; get_args
  217. ; gets the command line information from the psp
  218. ;ENTRY:
  219. ;     di points to a 127 byte buffer into which you want the command line
  220. ;        info copied.
  221. ;EXIT:
  222. ;     cx contains the number of characters on the command line
  223. ;     di points to the "buffer" area into which the info was copied
  224. ;     all other registers' previous values ARE preserved (i.e. not destroyed)
  225. get_args proc
  226.         push ax
  227.         push bx
  228.         push di
  229.         push si
  230.         push ds
  231.         mov ah, 62h
  232.         int 21h
  233.         push bx
  234.         mov cs:psp, bx
  235.         pop ds
  236.         mov si, 80h
  237.         lodsb
  238.         xor ch, ch
  239.         mov cl, al
  240.         push cx
  241.         rep movsb
  242.         pop cx
  243.         pop ds
  244.         pop si
  245.         pop di
  246.         pop bx
  247.         pop ax
  248.         ret
  249. get_args endp
  250.  
  251. ;Extract_args
  252. ;
  253. ;Searches for a '/' delimiter in arguments string followed by whatever
  254. ;character is sent in al, returns with di pointing to the first character
  255. ;following the character specified
  256. ;
  257. ;Entry: di - point to beginning of argument string
  258. ;       al - contains character which follows the '/' delimeter
  259. ;
  260. ;Exit:  CF set   - not found
  261. ;       CF clear - found
  262. ;                  di points to first char in arg string following
  263. ;                  /char 
  264. extract_args proc
  265.         mov cx, 127
  266. topside:
  267.         jcxz notfound
  268.         push ax
  269.         mov ax, "/"
  270.         repne scasb
  271.         pop ax
  272.         jnz topside
  273. got_slash:
  274.         scasb
  275.         jnz topside
  276. found_it:
  277.         clc
  278.         ret
  279. notfound:
  280.         stc
  281.         ret
  282. extract_args endp
  283.  
  284. convert_to_binary_number proc
  285.         xor bx, bx
  286. @@:
  287.         xor ax, ax
  288.         lodsb
  289.         cmp al, 57
  290.         jg non_numeric
  291.         sub ax, 48
  292.         jl non_numeric
  293.         push ax
  294.         mov ax, bx
  295.         mul ten
  296.         mov bx, ax
  297.         pop ax
  298.         add bx, ax
  299. space:  loop @b
  300. non_numeric:
  301.         ret
  302. convert_to_binary_number endp
  303.  
  304. uninstall       proc near
  305.         mov     ax, "UN"
  306.         mov     bx, "IN"
  307.         mov     cx, "ST"
  308.         mov     dx, "AL"
  309.         int     49h
  310.  
  311.         mov     es, bx
  312.         mov     es, es:[02ch]
  313.         mov     ah, 49h
  314.         int     ms_dos
  315.  
  316.         mov     es, cx
  317.         mov     ah, 49h
  318.         int     ms_dos
  319.  
  320.         in      al, 61h
  321.         and     al, 11111100b
  322.         out     61h, al
  323.  
  324.  
  325.         mov     dx, offset uninstallmsg
  326.         mov     ah, 09h
  327.         int     MS_DOS
  328.         mov     ax, 4c00h
  329.         INT     MS_DOS
  330. uninstall       endp
  331.  
  332. toggle_sound    proc    near
  333.         mov     ax,"SO"
  334.         mov     bx,"UN"
  335.         mov     cx,"D!"
  336.         int     49h
  337.         cmp     ax, 0
  338.         jz      @f
  339.         mov     dx, offset sound_on
  340.         mov     ah, 09h
  341.         int     MS_DOS
  342.         ret
  343. @@:     mov     dx, offset sound_off
  344.         mov     ah, 09h
  345.         int     MS_DOS
  346.         ret
  347. toggle_sound    endp
  348.  
  349. INIT1   PROC    NEAR
  350. ;
  351.         mov     ax, cs
  352.         mov     ds, ax
  353.         mov     es, ax
  354.  
  355.         mov     di, offset args
  356.         call    get_args
  357.         inc     di
  358.         mov     al, "u"
  359.         call    extract_args
  360.         jc      @f
  361.         push    es
  362.         MOV     AX,3549H                ; Get INT49h vector
  363.         INT     MS_DOS
  364.         MOV     WORD PTR [OLD_49_off],BX
  365.         MOV     WORD PTR [OLD_49_seg],ES
  366.  
  367.         mov     di, 103h
  368.         mov     si, offset signature
  369.         mov     cx, 3
  370.         repe    cmpsb
  371.         pop     es
  372.         jnz     no_way
  373.         jmp     already_installed
  374.  
  375. no_way: mov     dx, offset not_installed
  376.         jmp     show_msg_and_terminate
  377.  
  378. @@:     mov     di, offset args
  379.         inc     di
  380.         mov     al, "p"
  381.         call    extract_args
  382.         jnc     @f
  383.         jmp     not_good
  384. @@:     mov     al, byte ptr [di]
  385.         cmp     al, "4"
  386.         jne     @f
  387.         mov     word ptr chk_prt, 02e8h         ;COM4
  388.         jmp     got_port
  389. @@:     cmp     al, "2"
  390.         jne     @f
  391.         mov     word ptr chk_prt, 02f8h         ;COM2
  392.         jmp     got_port
  393. @@:     cmp     al, "3"
  394.         jne     @f
  395.         mov     word ptr chk_prt, 03e8h         ;COM3
  396.         jmp     got_port
  397. @@:     cmp     al, "1"
  398.         je      default
  399.         jmp     not_good
  400. default:
  401.         mov     word ptr chk_prt, 03f8h         ;COM1...Default
  402.  
  403.  
  404. got_port:
  405.         mov     byte ptr [comnum], al
  406.         mov     di, offset args
  407.         inc     di
  408.         mov     al, "r"
  409.         call    extract_args
  410.         jnc     @f
  411.         jmp     not_good
  412. @@:     mov     ax, word ptr [di]
  413.         mov     word ptr [nums], ax
  414.         mov     cx, 2
  415.         mov     si, di
  416.         call    convert_to_binary_number
  417.         cmp     bx, 0
  418.         jz      not_good
  419. ring_default:
  420.         mov     byte ptr [trigger], bl
  421.  
  422.         MOV     BYTE PTR CS:[BUSY],0    ; Free up busy-flag
  423.  
  424.         MOV     AX,3508H                ; Get clock vector
  425.         INT     MS_DOS
  426.         MOV     WORD PTR [OLD_OFF],BX
  427.         MOV     WORD PTR [OLD_SEG],ES
  428.  
  429.         MOV     AX,3549H                ; Get INT49h vector
  430.         INT     MS_DOS
  431.         MOV     WORD PTR [OLD_49_off],BX
  432.         MOV     WORD PTR [OLD_49_seg],ES
  433.  
  434.         mov     di, 103h
  435.         mov     si, offset signature
  436.         mov     cx, 3
  437.         repe    cmpsb
  438.         jz     already_installed
  439.  
  440.         MOV     AX,2508H                ; Patch INT 8
  441.         MOV     DX,OFFSET INTER         ; DS:DX = new vector
  442.         INT     MS_DOS
  443.  
  444.         MOV     AX, 2549h
  445.         MOV     DX, OFFSET CHANGE_TRIGGER
  446.         INT     MS_DOS
  447.  
  448.         MOV     DX, OFFSET CFH
  449.         MOV     AH, 09h
  450.         INT     MS_DOS
  451.  
  452.         mov     di, offset args
  453.         inc     di
  454.         mov     al, "s"
  455.         call    extract_args
  456.         mov     dx, offset sound_off
  457.         jnc      @f
  458.         mov     sound, 1                ;found "/s", sound is allowed
  459.         mov     dx, offset sound_on
  460. @@:     mov     ah, 09h
  461.         int     MS_DOS
  462.  
  463. ;
  464. ;       Terminate and stay-resident. Initialization-code is thrown away.
  465. ;
  466.         MOV     DX,OFFSET TOP           ; Last code to save
  467.         SHR     DX,1                    ; Div/2
  468.         SHR     DX,1                    ; Div/4
  469.         SHR     DX,1                    ; Div/8
  470.         SHR     DX,1                    ; Div/16
  471.         INC     DX                      ; Round up
  472.         MOV     AX,3100H
  473.         INT     MS_DOS
  474.  
  475. not_good:
  476.         mov     dx, offset bad_msg
  477.  
  478. show_msg_and_terminate:
  479.         mov     ah, 09h
  480.         int     21h
  481. terminate:
  482.         mov     ax, 4c01h
  483.         int     21h
  484.  
  485. already_installed:
  486.         mov     di, offset args
  487.         call    get_args
  488.         inc     di
  489.         mov     al, "u"
  490.         call    extract_args
  491.         jc      @f
  492.         call    uninstall
  493.         jmp     terminate
  494. @@:     mov     di, offset args
  495.         inc     di
  496.         mov     al, "s"
  497.         call    extract_args
  498.         jc      @f
  499.         call    toggle_sound
  500.         jmp     terminate
  501. @@:
  502.         mov     dx, offset twice
  503.         jmp     show_msg_and_terminate
  504.  
  505. INIT1   ENDP
  506. PRG_END EQU     $
  507. args            db 127 dup(0)
  508. ten             dw 10
  509. uninstallmsg    db "Uninstallation complete",13,10,13,10,"$"
  510. BAD_MSG         DB 13,10,"Invalid command line ",13,10,13,10
  511.                 DB "USAGE: PHONEV4 /p<portnumber> /r<ringcount> [/s] [/u]",13,10,13,10
  512.                 DB "                 portnumber = 1-4",13,10
  513.                 DB "                  ringcount = 1-99",13,10,13,10
  514.                 DB "             /s to enable/disable sound",13,10,13,10
  515.                 DB "                  /u to Uninstall",13,10
  516.                 DB 13,10,13,10,"$"
  517. twice           DB 13,10,"CFHSoftware's Phone monitor is already installed!",13,10,"$"
  518. CFH             DB 13,10,13,10,"PHONE v4 - BBS Crash monitor by "
  519.                 DB "CFHSoftware",13,10,13,10
  520.                 DB "Monitoring COM"
  521. comnum          db "  and will reboot the system on ring number "
  522. nums            DB "   ",13,10,13,10,"$"
  523. sound_on        db 13,10,"Sound is enabled",13,10,"$"
  524. sound_off       db 13,10,"Sound is disabled",13,10,"$"
  525. not_installed   db 13,10,"CFHSoftware's PHONE monitor not installed!!!!!",13,10,"$"
  526. ;
  527. ;
  528. PSEG    ENDS
  529.         END     MAIN
  530.